package trabalho.das.fxml.views.controladores;

import comandos.ComandoApagarTelha;
import comandos.ComandoCriarCopia;
import comandos.ComandoCriarEstiloDeFamilia;
import comandos.ComandoCriarEstiloDeTelha;
import comandos.IComando;
import comandos.IGestorComandos;
import entidades.Decorador;
import entidades.Familia;
import entidades.Telha;
import entidades.TelhaBase;
import entidades.interfaces.ITelhaBaseVisitante;
import fabricas.FabricaMoverEstrategia;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.collections.ListChangeListener;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.image.Image;
import javafx.stage.Modality;
import javafx.stage.Stage;
import sistema.Sistema;
import trabalho.das.fxml.views.AjudaView;
import trabalho.das.fxml.views.CriarDecoradorView;
import trabalho.das.fxml.views.CriarEstiloView;
import trabalho.das.fxml.views.CriarFamiliaView;
import trabalho.das.fxml.views.CriarTelhaView;
import trabalho.das.fxml.views.InspecaoDecoradorView;
import trabalho.das.fxml.views.InspecaoTelhaView;
import trabalho.das.fxml.views.MainView;
import trabalho.das.fxml.views.SobreView;
import trabalho.das.fxml.views.VerTodasAsFamiliasView;
import trabalho.das.fxml.views.VerTodosOsEstilosView;
import trabalho.das.fxml.views.uicomponents.CanvasGrid.ControladorCanvasGrid;
import trabalho.das.fxml.views.uicomponents.CodeEditor;

/**
 * Trabalho DAS - 2014/2015
 *
 * @author a21210380, a21190325, a21210392
 */
public class ControladorMainView implements ControladorCanvasGrid, Initializable, ITelhaBaseVisitante {

    private final MainView mainView;
    
    @FXML
    private ListView<IComando> history;
    
    @FXML
    private Button redoButton;
    
    @FXML
    private Button undoButton;

    public ControladorMainView(MainView mainView) {
        this.mainView = mainView;
    }
    
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        redoButton.setDisable(true);
        undoButton.setDisable(true);
        
        IGestorComandos gestorComandos = Sistema.getInstance().getGestorComandos();
        history.setItems(gestorComandos.getUndoList());
        gestorComandos.addRedoListener((ListChangeListener.Change<? extends IComando> c) -> {
            redoButton.setDisable(gestorComandos.isRedoEmpty());
        });
        gestorComandos.addUndoListener((ListChangeListener.Change<? extends IComando> c) -> {
            undoButton.setDisable(gestorComandos.isUndoEmpty());
        });
    }

    @FXML
    private void onEstrategiaNormalPressionado(ActionEvent event) {
        Sistema.getInstance().setMoverEstrategia(FabricaMoverEstrategia.getEstrategia(FabricaMoverEstrategia.Tipo.Normal));
    }

    @FXML
    private void onEstrategiaGrelhalPressionado(ActionEvent event) {
        Sistema.getInstance().setMoverEstrategia(FabricaMoverEstrategia.getEstrategia(FabricaMoverEstrategia.Tipo.Grelha));
    }

    @FXML
    private void onEstrategiaAncoralPressionado(ActionEvent event) {
        Sistema.getInstance().setMoverEstrategia(FabricaMoverEstrategia.getEstrategia(FabricaMoverEstrategia.Tipo.Ancoras));
    }

    @FXML
    private void onCriarFamiliaPressionado(ActionEvent event) {
        showView(new CriarFamiliaView(), "DAS - Criar familia");
    }

    @FXML
    private void onCriarTelhaPressionado(ActionEvent event) {
        showView(new CriarTelhaView(), "DAS - Criar telha");
    }

    @FXML
    private void onCriarEstiloPressionado(ActionEvent event) {
        showView(new CriarEstiloView(), "DAS - Criar estilo");
    }

    @FXML
    private void onCriarTemplatePressionado(ActionEvent event) {
        showView(new CodeEditor(), "DAS - Criar template");
    }

    @FXML
    public void onSavePressionado(ActionEvent event) {
        Sistema.getInstance().guardarFicheiro();
    }

    @FXML
    public void onUndoPressionado(ActionEvent event) {
        Sistema.getInstance().getGestorComandos().undo();
    }

    @FXML
    public void onRedoPressionado(ActionEvent event) {
        Sistema.getInstance().getGestorComandos().redo();
    }

    @FXML
    public void onVerTodasAsFamiliasPressionado(ActionEvent event) {
        showView(new VerTodasAsFamiliasView(), "DAS - Ver familias");
    }

    @FXML
    public void onVerTodosOsEstilosPressionado(ActionEvent event) {
        showView(new VerTodosOsEstilosView(), "DAS - Ver estilos");
    }

    @FXML
    public void onSairPressionado(ActionEvent event) {
        Platform.exit();
    }

    @FXML
    public void onSobrePressionado(ActionEvent event) {
        showView(new SobreView(), "DAS - Sobre");
    }

    @FXML
    public void onAjudaPressionado(ActionEvent event) {
        showView(new AjudaView(), "DAS - Ajuda");
    }

    @Override
    public void decorar(TelhaBase telha) {
        showView(new CriarDecoradorView(telha), "DAS - Criar decorador");
    }

    @Override
    public void criarCopia(TelhaBase telha) {
        ComandoCriarCopia d = new ComandoCriarCopia(telha);
        Sistema.getInstance().getGestorComandos().executeComando(d);
    }

    @Override
    public void apagar(TelhaBase telha) {
        ComandoApagarTelha c = new ComandoApagarTelha(telha);
        Sistema.getInstance().getGestorComandos().executeComando(c);
    }

    @Override
    public void criarEstiloDeTelha(TelhaBase telha) {
        ComandoCriarEstiloDeTelha c = new ComandoCriarEstiloDeTelha(telha);
        Sistema.getInstance().getGestorComandos().executeComando(c);
    }

    @Override
    public void criarEstiloDeFamilia(Familia familia) {
        ComandoCriarEstiloDeFamilia c = new ComandoCriarEstiloDeFamilia(familia);
        Sistema.getInstance().getGestorComandos().executeComando(c);
    }

    @Override
    public void inspecionar(TelhaBase telha) {
        telha.acceptChain(this);
    }
    
    @Override
    public void visitante(Telha telha) {
        showView(new InspecaoTelhaView(telha), "DAS - Visitar telha");
    }

    @Override
    public void visitante(Decorador decorador) {
        showView(new InspecaoDecoradorView(decorador), "DAS - Visitar decorador");
        
    }

    @Override
    public void click(float x, float y, boolean ctr) {
        Sistema.getInstance().click(x, y, ctr);
    }

    @Override
    public void drag(float x, float y, boolean ctr) {
        Sistema.getInstance().drag(x, y, ctr);
    }

    private void showView(Parent root, String title) {
        Scene scene = new Scene(root);
        Stage stage = new Stage();
        stage.setTitle(title);
        stage.initModality(Modality.WINDOW_MODAL);
        stage.initOwner(mainView.getScene().getWindow());
        stage.getIcons().add(new Image(getClass().getResourceAsStream( "/resources/icones/app.png" )));
        stage.setScene(scene);
        stage.showAndWait();
    }
}
